package com.eric.service.impl;
import cn.dev33.satoken.util.SaResult;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.eric.domain.dto.SysRoleDto;
import com.eric.domain.po.SysRole;
import com.eric.mapper.SysRoleMapper;
import com.eric.service.ISysRoleService;
import com.github.yulichang.base.MPJBaseServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
 * <p>
 * 角色表 服务实现类
 * </p>
 *
 * @author 新哥
 * @since 2024-03-12
 */
@Service
public class SysRoleServiceImpl extends MPJBaseServiceImpl<SysRoleMapper, SysRole> implements ISysRoleService {
    @Override
//    事务管理注解
    @Transactional
    public SaResult saveRoleListService(List<SysRoleDto> roleDtoList) {
//        先判断传进来的数据中，是否有null，“ ”等无效数据
        for (SysRoleDto sysRoleDto : roleDtoList) {
            if (StrUtil.hasBlank(sysRoleDto.getRoleName())){
                return SaResult.error("输入有误，请检查后重新输入！");
            }
        }
//         1、从数据库中获取到所有角色
        List<SysRole> listInDbs = list();
//        2、把数据库中取得的数组中的roleName放在一个集合中List<String> ListDb
        List<String>listNameInDb=new ArrayList<>();
        for (SysRole listInDb : listInDbs) {
            listNameInDb.add(listInDb.getRoleName());
        }
//        System.out.println("listNameInDb:"+listNameInDb);
//        3、把前端传来的roleDtoList中的roleName放在一个集合中List<String> ListHttp
        List<String>listNameInVue=new ArrayList<>();
        for (SysRoleDto sysRoleDto : roleDtoList) {
            listNameInVue.add(sysRoleDto.getRoleName());
        }
//        4、找出ListHttp中的有不在ListDb中的元素，并放在一个List<String>中，用List的removeAll()方法
        listNameInVue.removeAll(listNameInDb);
//        5、把差值转换为SysRole对象并存进数据库
        if (listNameInVue.isEmpty()){
            return SaResult.ok("输入的角色已经存在数据库中，不用重复输入");
        }
        List<SysRole>roleList=new ArrayList<>();
        for (String roleName : listNameInVue) {
            SysRole sysRole=new SysRole();
            roleList.add(sysRole.setRoleName(roleName));
        }
//      6、把SysRole批量写进数据库
        saveBatch(roleList);
        return SaResult.ok();
    }

    @Override
//    获取所有角色名称
    public SaResult getAllRolesService(Integer current,Integer pageSize) {
        if (current==null){
            current=1;
        }
        if (pageSize==null){
            pageSize=10;
        }
        Page<SysRole>page=new Page<>(current,pageSize);
        List<SysRole> sysRoleList = query().orderByDesc("update_time").page(page).getRecords();
        List<SysRoleDto> sysRoleDtos = BeanUtil.copyToList(sysRoleList, SysRoleDto.class);
        List<String>roleList=new ArrayList<>();
        for (SysRoleDto sysRoleDto : sysRoleDtos) {
            roleList.add(sysRoleDto.getRoleName());
        }
        return SaResult.data(roleList);
    }

    /*
     * 通过id的集合批量删除Role    *
     * */
    @Override
    @Transactional
//    根据id列表批量删除role数据
    public SaResult deleteRolesService(List<Integer> ids) {
        List<SysRole> roleList = listByIds(ids);
        if (roleList.size()!=ids.size()){
            return SaResult.error("id不存在，请检查后再试");
        }
        boolean b = removeBatchByIds(roleList);
        return b?SaResult.ok("succeed!"):SaResult.error("wrong");

    }

    @Override
    @Transactional
//    批量修改Role
    public SaResult modifyRolesService(List<SysRoleDto> roleDtos) {
        if (BeanUtil.isEmpty(roleDtos)){
            return SaResult.error("roles is null");
        }
        for (SysRoleDto roleDto : roleDtos) {
            if (BeanUtil.isEmpty(roleDto.getId())||BeanUtil.isEmpty(roleDto.getRoleName())){
                return SaResult.error("有role错误");
            }
        }
        List<SysRole> roleList = BeanUtil.copyToList(roleDtos, SysRole.class);
        boolean b = updateBatchById(roleList);
        return b?SaResult.ok("succeed"):SaResult.error("wrong");
    }

    @Override
    public SaResult getOneByIdService(Integer id) {
        SysRole role = query().eq("id", id).one();
        return BeanUtil.isEmpty(role)?
                SaResult.error("没有此角色"):
                SaResult.data(BeanUtil.copyProperties(role,SysRoleDto.class));
    }
}
